package com.movie.ticket.sale.moviezuul.filter;

import com.netflix.zuul.context.RequestContext;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.xml.transform.Result;
import java.util.Date;
import java.util.Map;

@Component
public class JWTHelper {


    /**
     * JWT签名加密key
     */
    private static String JWT_SIGN_KEY = "asdfghjklqwertyuiopmnbvcxzlkjhgf";

    /**
     * 用户登录成功后生成Jwt
     * 使用Hs256算法
     *
     * @param exp jwt过期时间
     * @param payload 保存在Payload（有效载荷）中的内容
     * @return token字符串
     */
    public  String createJWT(Date exp, Map<String, Object> payload) {
        //指定签名的时候使用的签名算法
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        //生成JWT的时间
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);

        //创建一个JwtBuilder，设置jwt的body
        JwtBuilder builder = Jwts.builder()
                //保存在Payload（有效载荷）中的内容
                .setClaims(payload)
                //iat: jwt的签发时间
                .setIssuedAt(now)
                //设置过期时间
                 .setExpiration(exp)
                //设置签名使用的签名算法和签名使用的秘钥
                .signWith(signatureAlgorithm, JWT_SIGN_KEY);

        return builder.compact();
    }

    /**
     * 解析token，获取到Payload（有效载荷）中的内容，包括验证签名，判断是否过期
     *
     * @param token
     * @return
     */
    public static Claims parseJWT(String token) {
        //得到DefaultJwtParser
        Claims claims = Jwts.parser()
                //设置签名的秘钥
                .setSigningKey(JWT_SIGN_KEY)
                //设置需要解析的token
                .parseClaimsJws(token).getBody();
        return claims;
    }

    public static void main(String[] args) {
        //指定签名的时候使用的签名算法
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        JWTHelper jwtHelper = new JWTHelper();
        Claims claims = jwtHelper.parseJWT("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6MSwibmFtZSI6InpoYW5nc2FuIiwicGFzc3dvcmQiOiJyb290MTIzIiwidGVsIjoiMTU1MjMzMTUxNjEiLCJhZ2UiOjI0LCJnZW5kZXIiOiLnlLciLCJoZWFkUGhvdG8iOm51bGwsInBvaW50cyI6NTAwLCJpbmZvIjoi5oiR5b6I5biFIiwibGFiZWwiOiLlvojluIUiLCJpbGxlZ2FsIjowLCJzdGF0ZSI6MSwiaWF0IjoxNjA4MDAyODA2LCJleHAiOjE2MDgyNjIwMDZ9.ZlDIINiN8KvMtdYUrMrL-qiDZuaz4hka1lie7ytfJ-Q");
   System.out.println(claims);
        Object id = claims.get("id");
        Object role = claims.get("role");
        Object tel = claims.get("tel");
        System.out.println(id);
        System.out.println(role);
        System.out.println(tel);
    }

    //获取前端传过来得到的token
    public Claims getClaims(){
        //获取请求对象
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String token = request.getParameter("token");
        //解析token
        //指定签名的时候使用的签名算法
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        JWTHelper jwtHelper = new JWTHelper();
        Claims claims = jwtHelper.parseJWT(token);
        return claims;
    }


}
